/*
 * @Date: 2021-09-12 19:21:05
 * @Author: Acckno1
 * @LastEditTime: 2021-09-12 19:23:30
 * @Description: 
 */
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

const int N = 1e6 + 10;

int n, d;
bool p[N]; // 存放素数

bool isPrime (int n) {
    return !p[n];
}

// 将n转换成d进制，反转之后，再转换成十进制的值。
int radixTransform(int n, int d) {
    // n转换成d进制
    string s = "";
    while (n) {
        int mod = n % d;
        s += mod + '0';
        n /= d;
    }
    // d进制的n反转之后转换成十进制
    int num = 0;
    int r = 1;
    for (int i = s.size() - 1; i >= 0; i -- ) {
        int e = s[i] - '0';
        num += e * r;
        r *= d;
    }
    return num;
}

int main() {
    memset(p, false, sizeof p);
    p[1] = true;
    
    // 打表算素数
    // 其他方式算素数会TLE
    for (int i = 2; i < N; i ++ ) {
        if (p[i]) continue;
        for (int k = 2; i * k < N; k ++) p[i * k] = true;
    }

    while (cin >> n && n >= 0) {
        cin >> d;
        if (!isPrime(n)) puts("No");
        else {
            if (isPrime(radixTransform(n, d))) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}